package editorsvg.editor.formas;

import editorsvg.editor.atributos.AtrLongitud;
import editorsvg.propiedades.GrupoPropiedades;
import editorsvg.propiedades.PropiedadDouble;
import java.awt.Shape;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RectangularShape;
import java.awt.geom.RoundRectangle2D;

/**
 * Forma que representa un rectangulo.
 * @author Jorge Berjano
 */
public class Rectangulo extends Forma {

    private AtrLongitud x = new AtrLongitud();
    private AtrLongitud y = new AtrLongitud();
    private AtrLongitud ancho = new AtrLongitud();
    private AtrLongitud alto = new AtrLongitud();
    private AtrLongitud rx = new AtrLongitud();
    private AtrLongitud ry = new AtrLongitud();
    private Rectangle2D rectNormal = new Rectangle2D.Double();
    private RoundRectangle2D rectRedondeado = new RoundRectangle2D.Double();
    private RectangularShape rect = rectNormal;
    private static GrupoPropiedades propiedadesForma;

    @Override
    public String getNombreTag() {
        return "rect";
    }

    @Override
    public Shape getShape() {
        return rect;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        Rectangulo clon = (Rectangulo) super.clone();
        clon.x = (AtrLongitud) x.clone();
        clon.y = (AtrLongitud) y.clone();
        clon.ancho = (AtrLongitud) ancho.clone();
        clon.alto = (AtrLongitud) alto.clone();
        clon.rx = (AtrLongitud) rx.clone();
        clon.ry = (AtrLongitud) ry.clone();
        clon.rectNormal = (Rectangle2D) rectNormal.clone();
        clon.rectRedondeado = (RoundRectangle2D) rectRedondeado.clone();
        
        actualizar();
        return clon;
    }

    @Override
    public void actualizar() {
        if (x.getValor() == null || y.getValor() == null ||
                ancho.getValor() == null || alto.getValor() == null) {
            return;
        }
        if (rx.getValor() == null && ry.getValor() == null) {
            rectNormal.setRect(x.getValor(), y.getValor(), ancho.getValor(), alto.getValor());
            rect = rectNormal;
        } else {
            rectRedondeado.setRoundRect(x.getValor(), y.getValor(), ancho.getValor(), alto.getValor(),
                    2 * (rx.getValor() == null ? ry.getValor() : rx.getValor()), 2 * (ry.getValor() == null ? rx.getValor() : ry.getValor()));
            rect = rectRedondeado;
        }
    }

    @Override
    public GrupoPropiedades getPropiedades() {
        if (propiedadesForma == null) {
            propiedadesForma = new GrupoPropiedades("Rectangulo");
            propiedadesForma.agregarPropiedad(new PropiedadDouble("x"));
            propiedadesForma.agregarPropiedad(new PropiedadDouble("y"));
            propiedadesForma.agregarPropiedad(new PropiedadDouble("ancho", "width"));
            propiedadesForma.agregarPropiedad(new PropiedadDouble("alto", "height"));
            propiedadesForma.agregarPropiedad(new PropiedadDouble("rx"));
            propiedadesForma.agregarPropiedad(new PropiedadDouble("ry"));
        }

        return propiedadesForma;
    }

    public void setPosicion(Point2D posicion) {
        setX(posicion.getX());
        setY(posicion.getY());
    }

    public Point2D getPosicion() {
        if (getX() != null && getY() != null) {
            return new Point2D.Double(getX(), getY());
        } else {
            return null;
        }

    }

    public AtrLongitud x() {
        return x;
    }

    public AtrLongitud y() {
        return y;
    }

    public AtrLongitud ancho() {
        return ancho;
    }

    public AtrLongitud alto() {
        return alto;
    }

    public AtrLongitud rx() {
        return rx;
    }

    public AtrLongitud ry() {
        return ry;
    }

    public void setX(Double valor) {
        x.setValor(valor);
    }

    public Double getX() {
        return x.getValor();
    }

    public void setY(Double valor) {
        y.setValor(valor);
    }

    public Double getY() {
        return y.getValor();
    }

    public void setAncho(Double valor) {
        ancho.setValor(valor);
    }

    public Double getAncho() {
        return ancho.getValor();
    }

    public void setAlto(Double valor) {
        alto.setValor(valor);
    }

    public Double getAlto() {
        return alto.getValor();
    }

    public void setRx(Double valor) {
        rx.setValor(valor);
    }

    public Double getRx() {
        return rx.getValor();
    }

    public void setRy(Double valor) {
        ry.setValor(valor);
    }

    public Double getRy() {
        return ry.getValor();
    }
}
